#ifndef L_P_H
#define L_P_H

    #include "list_carre.h"
    #include <time.h>

    /* Structures faites par Valentin :
        Structures permettant de gérer une liste de pièces */
    typedef struct piece{
      int abscisse;
      int ordonner;
      int rotation;
      int rotation_unique;
      int inverse_utile;
      int R;
      int G;
      int B;
      int select;
      list_carre * rotation1;
      list_carre * rotation2;
      list_carre * rotation3;
      list_carre * rotation4;
      list_carre * rotation1i;
      list_carre * rotation2i;
      list_carre * rotation3i;
      list_carre * rotation4i;
      struct piece * suivant;
    }piece;

    typedef struct list_piece{
        piece * plateau;
        int nb_piece;
    }list_piece;

    //Fonctions faites par Valentin:

    // Crée une pièce vide.
    piece * creat_piece() ;

    // Crée une liste de pièces vide.
    list_piece * creat_list_piece() ;

    // Renvoie l'adresse de la liste de carrés correspondante à la rotation actuelle de la pièce.
    list_carre * bonne_rotation(piece * p) ;

    // Fonctions faites par Thibault :

    // Test si deux rotations sont identiques.
    int test_rotation_egales(list_carre * r1, list_carre * r2) ;

    // Crée une rotation à partir d'une autre rotation.
    list_carre * make_rotation(list_carre * list_carre, int rotation);

    // Permet de compléter toutes les rotations d'une pièce à partir de la première rotation.
    void make_piece(piece * piece);

    // Renvoie une pièce identique à la pièce passée en paramètre.
    piece * cloner_piece(piece * p) ;

    // Fonctions faites par Valentin :

    // Ajoute une pièce en dexuième position d'une liste(sauf si elle est vide).
    void add_piece(list_piece *l,piece *p) ;

    // Ajoute une pièce dans une liste après la pièce passée en paramètre.
    void add_piece_precis(list_piece *l,piece *p_ajouter, piece * p_avant) ;

    // Fait passer une pièce de la reserve de pièces à la liste de pièces jouées.
    void jouer_piece(list_piece * reserve,piece *p,list_piece * dejajouer) ;

    // Fait passer une pièce de la liste de pièces jouées à la réserve de pièces.
    void remise_en_jeu(list_piece * reserve,piece *p,list_piece * dejajouer) ;

    // Fait passer une pièce de la liste de pièces jouées à la réserve de pièces avec un position donnée.
    void remise_en_jeu_precise(list_piece * reserve,piece *p,list_piece * dejajouer, piece * p_avant) ;

    // Supprime une pièce dans une liste avec désallocation de mémoire.
    void sup_piece_dans_list(list_piece * l, piece * p) ;

    // Désalloue toute la mémoire associée à un liste.
    void sup_list_piece(list_piece * l) ;


#endif
